/**
 * \file aktionsmanager.h
 *
 * \brief Enthält die Klasse Aktionsmanager.
 */

#ifndef _AKTIONSMANAGER_H_
#define _AKTIONSMANAGER_H_

#include <glibmm.h>
#include "feld.h"
#include <time.h>
#include <stdlib.h>
#include "viewer.h"
#include "zustand.h"
#include "dateimanager.h"



/** \class Aktionsmanager
*       \brief Der Aktionsmanager führt die vom Nutzer angeforderten Aktionen aus.
*
*		Der Aktionsmanager führt die vom Nutzer angeforderten Aktionen aus. Dazu "befragt" er ein Objekt der Klasse Zustand und dirigiert die notwendigen Aufgaben an Feld und Dateimanager.
*/

class Aktionsmanager
{
        private:
                Gtk::Label *generation; /** Pointer auf Textfeld, der die aktuelle Generation anzeigt*/
                Glib::Mutex *mutex,*drawingmutex;    /**< Mutex Variable */
                Feld *feld;                             /**< Das Feld, welches der Aktionsmanager erzeugt und anweist */
                Regelwerk *regelwerk;   /**< Das Regelwerk, nachdem das Feld arbeitet */
                Viewer* viewer;                 /**< Der Viewer zur Anzeige des Feldes */
                Zustand *zustand;               /**< Der Zustand, nach welchem der Aktionsmanager "handelt" */
                Dateimanager *dateimanager;     /**< Der Dateimanager, welcher die Speicherung und das Laden für Feld übernimmt */
                Glib::Dispatcher *m_dispatcher; /**< Dispatcher, der das Malen nach der Berechnung im anderen Thread verannlasst */
                 Glib::Dispatcher *s_dispatcher; /**< Dispatcher, der nach erfolgreicher Speicherung die Darstellung der Nachricht im anderen Thread veranlasst */
                 Glib::Dispatcher *z_dispatcher; /**< Dispatcher, der nach dem Laden, die Aenderung des Zooms veranlasst */
        public:
                /**
                * \fn int isRunning()
                * \brief Gibt zurück, ob bereits ein Thread im Aktionsmanager am arbeiten ist.
                */
                bool isRunning();
                
                /**
                *       \fn void run()
                *       \brief Ruft den Aktionsmanager auf, um den Nutzerwunsch zu bearbeiten.
                */
                void run();
                
                /**
                *       \fn Aktionsmanager(Feld*,Regelwerk*, Viewer*, Zustand*, Dateimanager*,Gtk::Label *gen,Glib::Mutex*dmutex,Glib::Dispatcher *m_dis,Glib::Dispatcher *s_dis);
                *       \brief Standard Konstruktor.
				*  		\param f Zeiger auf das Feld, welches die Daten speichert.
				*  		\param r Zeiger auf Regelwerk, welches von Feld verwendet wird.
				*  		\param z Zeiger auf Zustand, zur Kommunikation mit der GUI.
				*  		\param d Zeiger auf Dateimanager, welcher das Speichern übernimmt.
        *  		\param m_dis Zeiger auf Dispatcher, welcher das Malen im anderen Thread veranlasst.
        *  		\param s_dis Zeiger auf Dispatcher, welcher das Zeichnen des Speichern-Erfolgreich-Dialogs veranlasst.
        *  		\param z_dis Zeiger auf Dispatcher, welcher das aendern des Zoomes beim Laden veranlasst.
            
                */
                Aktionsmanager(Feld*,Regelwerk*, Viewer*, Zustand*, Dateimanager*,Gtk::Label *gen,Glib::Mutex*dmutex,Glib::Dispatcher *m_dis,Glib::Dispatcher *s_dis,Glib::Dispatcher *z_dis);
                ~Aktionsmanager();
                
        private:
                
                void doSave();
                void doLoad();
                void doSingleStep();
                void doRunning();
                void doRandom();
                void doSetCell();
                void doSetHeightWidth();
                void doChangeRule();
                void doshowfield();     // zum anzeigen des feldes wird häufiger gebraucht, deshalb hab ichs ausgelagert
                
};

#endif
